#include "connexionbdd.h"

#include <iostream>

QSqlDatabase db;

ConnexionBDD::ConnexionBDD(QObject *parent) :
    QObject(parent)
{
}

QString currentHote;

// Code Erreur
// -1 : hôte non rensegniée
// -2 : Aucune hôtes n'a répondu
// -3 : Autentification utilisateur impossible
// -4 : Les infos fournis ne sont pas conforme
// -5 : PG not found

int setServer()
{
    // On vérifie si l'hôte est renseigné
    QSettings s;
    QStringList hotes = s.value("connexion/host").toStringList();
    if(hotes.isEmpty()){
        bool ok = false;
        hotes << QInputDialog::getText(0,"Hôte","Veillez renseigner le nom d'un hôte (ou IP) du serveur.",QLineEdit::Normal,"localhost",&ok);
        if(ok) s.setValue("connexion/host",hotes);
        else return -1;
    }
    
    QStringListIterator Iterator(hotes);
    
    while(Iterator.hasNext())
    {
        currentHote = Iterator.next();

        //On ferme une hypothétique base déjà ouverte
        QSqlDatabase::database().close();
        QSqlDatabase::removeDatabase("guest");
        QSqlDatabase::removeDatabase("user");
        
        //On créer la connexion avec les infos correspondantes
        db = QSqlDatabase::addDatabase("QMYSQL","guest");
        db.setHostName(currentHote);
        db.setDatabaseName("ostofub");
        db.setUserName("Babasse");
        db.setPassword("Babasse");
        db.setConnectOptions("MYSQL_OPT_RECONNECT=1");
        
        //On ouvre la base, et on la teste
        if(db.open()) return 0;
    }
    
    currentHote = "";
    return -2;
}

int ConnexionBDD::coGuest(){
	return setServer();
}

int ConnexionBDD::upCo(int fams, QString proms, QString mdp, QString droit){

	int lastError = setServer();
	if(lastError<0) return lastError;
	
	QSqlQuery query(db);
	//On récupère le mot de passe de connexion pour la nouvelle connexion
	query.prepare("SELECT connect_pass(:f,get_proms(:p),:m,:u)");
	query.bindValue(":f",QVariant(fams));
	query.bindValue(":p",QVariant(proms));
	query.bindValue(":m",QVariant(mdp));
	query.bindValue(":u",QVariant(droit));
	query.exec();

	if(query.first()){
		QString pass = query.value(0).toString();
		//On ferme la base invite
		db.close();
		QSqlDatabase::removeDatabase("guest");
		//On ouvre une nouvelle base
		db = QSqlDatabase::addDatabase("QMYSQL","user");
        db.setHostName(currentHote);
		db.setDatabaseName("ostofub");
		db.setUserName(droit);
		db.setPassword(pass);

		if(db.open()){
			return 0;
		} else {
		//Si la base ne peut pas s'ouvrir on affiche une erreur
		//QMessageBox::warning(this,tr("Nom de la base"), tr("La base ne veut pas s'ouvrir! Pas de chance :D !!!"));
			return -2;
		}

	}else{
		return -3;
	}
}

int ConnexionBDD::connexion(QWidget *parent, QString droit){

    int lastError=0;
    std::cout << "-20\n";
	
    //On connecte une session invite
	lastError = coGuest();
    if(lastError < 0){
        return lastError;
    }
    db = QSqlDatabase::database("guest");

    //On créé une variable d'erreur
    bool ok = false;
    //On demande la fams
    QString sfams = QInputDialog::getText(parent,"Fam's","Entrez votre fams pour identification!",QLineEdit::Normal,"",&ok);
    if(!ok){
        return -4;
    }
    //On transforme la fams en entier
    int fams = sfams.toInt(&ok);
    if(!ok){
        return -4;
    }
    //On récupère la liste des promotions pour la fams
    QStringList l;
    QSqlQuery q1(db);
    q1.prepare("SELECT proms FROM v_users WHERE fams = :f");
    q1.bindValue(":f",fams);
    q1.exec();
    if(q1.first()){
        l.append(q1.value(0).toString());
        while(q1.next()){
            l.append(q1.value(0).toString());
        }
        q1.finish();
        //On demande la proms dans un choix
        QString proms = QInputDialog::getItem(parent,"Promotion","Entrez votre promotion pour identification!",l,0,false,&ok);
        if(!ok){
            return -4;
        }
        //On demande le mot de passe
        QString mdp = QInputDialog::getText(parent,"Mot de passe","Entrez votre mot de passe",QLineEdit::Password,"",&ok);
        if(!ok){
            return -4;
        }

        //On test la connexion
        lastError = upCo(fams,proms,mdp,droit);
        if(lastError>=0){
            db = QSqlDatabase::database("user");
            //On récupère l'id du compte
            QSqlQuery q2(db);
            q2.prepare("SELECT get_compte(:f,get_proms(:p))");
            q2.bindValue(":f",fams);
            q2.bindValue(":p",proms);
            q2.exec();
            if(q2.first()){
                return q2.value(0).toInt();

            } else {
                return -5;
            }

        } else {
            return lastError;
        }

    }else{
        q1.finish();
        return -5;
    }
}
